package gl.android.xmppandroidclient.server;

import gl.android.util.NotificationUtil;
import gl.android.xmppandroidclient.common.Constant;
import gl.android.xmppandroidclient.db.MessagePersistencer;
import net.tsz.afinal.FinalDb;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.packet.Message;

import android.content.Context;

/**
 * 监听XMPP服务器发来的所有消息.保存到DB并以android broadcast 的方式转发
 * 
 * @author GeLiang
 * 
 */
public class XmppChatMangerListener implements ChatManagerListener,
		MessageListener {
	private Context mContext;
	private FinalDb mFinalDb;
	// private static String mChatting;
	public static final String CHANCE_JSON_MESSAGE = "10000";
	public static final String PACKETINDEX = "packetIndex";
	public static final String MSG_UNREAD_FLAG = "1";
	public static final String MSG_READ_FLAG = "0";
	// private static boolean mStopAllNotify = false;

	private static String mChattingMsgId;

	private static XmppChatMangerListener mIns;
	public static final String BROADCAST_NEW_MESSAGE = "cn.chanceit.carbox.BROADCAST_NEW_MESSAGE";
	public static final String BROADCAST_MESSAGE_STAGE_CHANGE = "cn.chanceit.carbox.BROADCAST_MESSAGE_STAGE_CHANGE";

	public XmppChatMangerListener(Context cont) {
		mContext = cont;
		mFinalDb = FinalDb.create(cont, Constant.DB_NAME);
	}

	public static synchronized XmppChatMangerListener getInstance(
			Context context) {
		if (mIns == null) {
			if (mIns == null) {
				mIns = new XmppChatMangerListener(context);
			}
		}
		return mIns;
	}

	public static void SetChatting(String msgid) {
		mChattingMsgId = msgid;
	}

	// /**
	// * 处理离线消息
	// *
	// * @param message
	// * @return
	// */
	// public boolean processMessage(Message message) {
	// if (checkIsDeliveryMessage(message)) {// FIXME 关于离线消息中包含回执的问题.比如文件离线传送
	// return false;
	// }
	// if (checkIsRepeat(message)) {
	// return false;
	// }
	// MainMsgInfo info = null;
	// // "{\"name\":\"name0\",\"age\":0}";//
	// String jsonData = message.getBody();
	// Gson gson = new Gson();
	//
	// try {
	// info = gson.fromJson(jsonData, MainMsgInfo.class);
	// } catch (Exception e) {
	// e.printStackTrace();
	// // System.console().printf("%s", e.toString());
	// }
	//
	// String packetIndex = (String) message.getProperty(PACKETINDEX);
	// if (TextUtils.isEmpty(packetIndex)) {
	// packetIndex = message.getPacketID();
	// }
	//
	// if (CHANCE_JSON_MESSAGE.equals(packetIndex) || info.getMsgId() != null)
	// {// TODO
	// // 增加消息回执引起的代码修改
	//
	// } else {
	// info = new MainMsgInfo();
	// info.setMsgBody(message.getBody());
	// info.setMsgId("");
	// info.setTitle("");
	// info.setShopUid("");
	// info.setMsgType("0");
	// }
	//
	// info.setMsgTime(TimeRender.getDate());
	// info.setUserId(UserManager.getInstance().GetUserName4Push());
	//
	// if (Constant.MSG_TYPE_MYD_ID.equals(info.getMsgId())) {
	// info.setMsgId(info.getMsgId() + "-" + TimeRender.getDate());
	// }
	//
	// if (checkIgnorer(info)) {
	// return false;
	// }
	//
	// if (Integer.parseInt(info.getMsgType()) == Constant.INT_MSG_TYPE_PUSH) {
	// info.setMsgId(UserManager.getInstance().GetUserName4Push());
	// } else if (Integer.parseInt(info.getMsgType()) ==
	// Constant.INT_MSG_TYPE_MAINTAIN) {
	// info.setMsgId(UserManager.getInstance().GetUserName4Push() + "_"
	// + Constant.INT_MSG_TYPE_MAINTAIN);
	// } else if (Integer.parseInt(info.getMsgType()) ==
	// Constant.INT_MSG_TYPE_WARN) {
	// info.setMsgId(UserManager.getInstance().GetUserName4Push() + "_"
	// + Constant.INT_MSG_TYPE_WARN);
	// } else if (Integer.parseInt(info.getMsgType()) ==
	// Constant.INT_MSG_TYPE_CALL_NAV) {
	// info.setMsgId(UserManager.getInstance().GetUserName4Push() + "_"
	// + Constant.INT_MSG_TYPE_CALL_NAV);
	// }
	//
	// boolean bNotify = true;
	// if (mChattingMsgId != null && info.getMsgId().equals(mChattingMsgId)) {
	// bNotify = false;
	// }
	//
	// // 顺序不颠倒 跟下面的
	// saveInfo(info, message, bNotify ? MSG_UNREAD_FLAG : MSG_READ_FLAG);
	//
	// // mFinalDb.save(info);
	// androidProcessMessage(message);
	// return true;
	// }
	//
	@Override
	public void chatCreated(Chat chat, boolean able) {
		chat.addMessageListener(this);
	}
	//
	// private boolean checkIgnorer(MainMsgInfo info) {
	// int type = Integer.parseInt(info.getMsgType());
	// if (type == Constant.INT_MSG_TYPE_PUSH
	// || type == Constant.INT_MSG_TYPE_SURVEY
	// || type == Constant.INT_MSG_TYPE_MAINTAIN
	// || type == Constant.INT_MSG_TYPE_WARN
	// || type == Constant.INT_MSG_TYPE_CALL_NAV) {
	// return false;
	// }
	//
	// List<MainMsgInfo> list = mFinalDb.findAllByWhere(
	// MainMsgInfo.class,
	// "msgId='" + info.getMsgId() + "' and msgType='"
	// + info.getMsgType() + "'");
	//
	// if (list == null || list.size() == 0) {
	// return true;
	// }
	//
	// return false;
	// }
	//
	// private void saveInfo(MainMsgInfo info, Message message, String
	// msgReadFlag) {
	//
	// saveMainInfo(info);
	//
	// // 插入附表
	// SubMsgInfo subInfo = new SubMsgInfo();
	// subInfo.setMsgBody(info.getMsgBody());
	//
	// subInfo.setMsgId(info.getMsgId());
	// subInfo.setMsgTime(info.getMsgTime());
	// subInfo.setMsgUnreadFlag(msgReadFlag);
	// subInfo.setMsgType(info.getMsgType());
	// subInfo.setShopUid(info.getShopUid());
	// subInfo.setUserId(info.getUserId());
	// subInfo.setUUID_MESSAGE(message.getPacketID());
	//
	// switch (Integer.parseInt(info.getMsgType())) {
	//
	// case Constant.INT_MSG_TYPE_ORDER:
	// OrderInfo orderInfo = new Gson().fromJson(subInfo.getMsgBody(),
	// OrderInfo.class);
	//
	// if (orderInfo.getOrderTime().length() > 0) {
	// ContentValues values = new ContentValues();
	// values.put("msgExtData", orderInfo.getOrderTime());
	// mFinalDb.update(info, "msgId='" + info.getMsgId()
	// + "' and msgType='" + info.getMsgType() + "'", values);
	// }
	//
	// break;
	// case Constant.INT_MSG_TYPE_SURVEY:
	// try {
	// JSONObject jo = new JSONObject(info.getMsgBody());
	// jo.put("title", info.getTitle());
	// subInfo.setMsgBody(jo.toString());
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	// break;
	// default:
	// break;
	// }
	//
	// mFinalDb.save(subInfo);
	// }
	//
	// private void saveMainInfo(MainMsgInfo info) {
	// switch (Integer.parseInt(info.getMsgType())) {
	// case Constant.INT_MSG_TYPE_PUSH:
	// return;
	// case Constant.INT_MSG_TYPE_MAINTAIN:
	// return;
	// case Constant.INT_MSG_TYPE_WARN:
	// return;
	//
	// case Constant.INT_MSG_TYPE_SURVEY: {
	// mFinalDb.deleteByWhere(MainMsgInfo.class,
	// "msgType='" + info.getMsgType() + "'");
	// mFinalDb.save(info);
	// }
	// return;
	// default:
	// break;
	// }
	// List<MainMsgInfo> list = mFinalDb.findAllByWhere(
	// MainMsgInfo.class,
	// "msgId='" + info.getMsgId() + "' and msgType='"
	// + info.getMsgType() + "'");
	//
	// // 插入主表
	// if (list == null || list.size() == 0) {
	// String msgId = info.getMsgId();
	// if (msgId == null || msgId.equals("") || msgId.equals("0")) {
	// // nothing to do
	// } else {
	// mFinalDb.save(info);
	// }
	// } else {
	// ContentValues values = new ContentValues();
	// values.put("msgDelFlag", "0");
	// mFinalDb.update(info, "msgId='" + info.getMsgId()
	// + "' and msgType='" + info.getMsgType() + "'", values);
	// }
	//
	// }
	//
	// private void androidProcessMessage(Message message) {
	// Lg.i(this, "收到的非离线消息:" + message.toXML());
	// // android.os.Message msg = handler
	// // .obtainMessage();
	//
	// // {"content":"哈哈，投诉也没人甩你","title":"投诉2",
	// // "uuid":"20130710091925","companyId":"1","type":0}
	//
	// // {"type":"-1","companyId":"1","uuid":"20130710091923"}
	// if (checkIsDeliveryMessage(message)) {
	// return;
	// }
	// if (checkIsRepeat(message)) {
	// return;
	// }
	// MainMsgInfo info = null;
	// // "{\"name\":\"name0\",\"age\":0}";//
	// String jsonData = message.getBody();
	//
	// Gson gson = new Gson();
	//
	// try {
	// info = gson.fromJson(jsonData, MainMsgInfo.class);
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	//
	// String packetIndex = (String) message.getProperty("packetIndex");
	// if (TextUtils.isEmpty(packetIndex)) {
	// packetIndex = message.getPacketID();
	// }
	// if (CHANCE_JSON_MESSAGE.equals(packetIndex) || info.getMsgId() != null)
	// {// TODO
	// // 增加消息回执引起的代码修改
	//
	// } else if (info != null
	// && Integer.parseInt(info.getMsgType()) == Constant.INT_MSG_TYPE_CALL_NAV)
	// {
	// Lg.i(this, "CALL NAV MESSAGE:");
	// } else {
	// info = new MainMsgInfo();
	// info.setMsgBody(message.getBody());
	// info.setMsgId("");
	// info.setTitle("");
	// info.setShopUid("");
	// info.setMsgType("0");
	// }
	//
	// if (Constant.MSG_TYPE_MYD_ID.equals(info.getMsgId())) {
	// info.setMsgId(info.getMsgId() + "-" + TimeRender.getDate());
	// }
	//
	// info.setMsgTime(TimeRender.getDate());
	// info.setUserId(UserManager.getInstance().GetUserName4Push());
	//
	// if (checkIgnorer(info)) {
	// return;
	// }
	//
	// /*
	// * System.out.println(info.getUserId());
	// * System.out.println(info.getMsgId());
	// * System.out.println(info.getTitle());
	// * System.out.println(info.getMsgBody());
	// * System.out.println(info.getShopUid());
	// * System.out.println(info.getMsgType());
	// * System.out.println(info.getMsgTime());
	// */
	//
	// if (Integer.parseInt(info.getMsgType()) == Constant.INT_MSG_TYPE_PUSH) {
	// info.setMsgId(UserManager.getInstance().GetUserName4Push());
	// } else if (Integer.parseInt(info.getMsgType()) ==
	// Constant.INT_MSG_TYPE_MAINTAIN) {
	// info.setMsgId(UserManager.getInstance().GetUserName4Push() + "_"
	// + Constant.INT_MSG_TYPE_MAINTAIN);
	// } else if (Integer.parseInt(info.getMsgType()) ==
	// Constant.INT_MSG_TYPE_WARN) {
	// info.setMsgId(UserManager.getInstance().GetUserName4Push() + "_"
	// + Constant.INT_MSG_TYPE_WARN);
	// } else if (Integer.parseInt(info.getMsgType()) ==
	// Constant.INT_MSG_TYPE_CALL_NAV) {
	// info.setMsgId(UserManager.getInstance().GetUserName4Push() + "_"
	// + Constant.INT_MSG_TYPE_CALL_NAV);
	// }
	//
	// boolean bNotify = true;
	// if (mChattingMsgId != null && mChattingMsgId.length() > 0
	// && info.getMsgId().equals(mChattingMsgId)) {
	//
	// bNotify = false;
	//
	// }
	//
	// if (mChattingMsgId != null && mChattingMsgId.length() > 0
	// && mChattingMsgId.equals("-1")
	// && info.getMsgType().equals(Constant.MSG_TYPE_SURVEY)) {
	// bNotify = false;
	// }
	//
	// // 顺序不颠倒 跟下面的
	// saveInfo(info, message, bNotify ? MSG_UNREAD_FLAG : MSG_READ_FLAG);
	//
	// // if(mStopAllNotify) {
	// // bNotify = false;
	// // }
	//
	// // mFinalDb.save(info);
	// Intent newMsgIntent = new Intent(BROADCAST_NEW_MESSAGE);
	// mContext.sendBroadcast(newMsgIntent);
	//
	// //
	//
	// Intent intent = new Intent(Constants.ACTION_SHOW_NOTIFICATION);
	// intent.putExtra(Constants.NOTIFICATION_MSG_ID, info.getMsgId());
	// intent.putExtra(Constants.NOTIFICATION_MSG_TITLE, info.getTitle());
	// intent.putExtra(Constants.NOTIFICATION_MESSAGE, info.getMsgBody());
	// intent.putExtra(Constants.NOTIFICATION_MESSAGE_TYPE, info.getMsgType());
	// intent.putExtra(Constants.NOTIFICATION_MSG_SHOP4S, SharedAdapter
	// .getInstance(mContext).getShopInfo(mContext).getShopNickName());
	//
	// intent.putExtra(Constants.NOTIFICATION_DISABLE, bNotify);
	// // intent.setData(Uri.parse((new StringBuilder(
	// // "notif://notification.androidpn.org/")).append(
	// // notificationApiKey).append("/").append(
	// // System.currentTimeMillis()).toString()));
	//
	// mContext.sendBroadcast(intent);
	// Lg.i(this, "收到消息:" + message.toXML());
	//
	// // setNotiType(R.drawable.log,
	// // message.getBody());
	// // msg.obj = message.getBody();
	// // msg.sendToTarget();
	// }
	//
	// /**
	// * 通过消息的UUID检查是否是重复的消息
	// *
	// * @param message
	// * @return
	// */
	// private boolean checkIsRepeat(Message message) {
	// List<SubMsgInfo> allsubmessage = mFinalDb.findAll(SubMsgInfo.class);
	// for (int i = 0; i < allsubmessage.size(); i++) {
	// if (message.getPacketID().equals(
	// allsubmessage.get(i).getUUID_MESSAGE())) {
	// return true;
	// }
	// }
	// return false;
	// }
	//
	// public static boolean checkIsDeliveryMessage(Message message) {
	// Lg.i("Chatlistenr", "checkIsDeliveryMessage:" + message.toXML());
	// DeliveryReceipt dr = (DeliveryReceipt) message.getExtension(
	// DeliveryReceipt.ELEMENT, DeliveryReceipt.NAMESPACE);
	// if (dr != null) {
	// return true;
	// }
	// return false;
	// }
	MessagePersistencer mMessagePersistencer ;
	@Override
	public void processMessage(Chat arg0, Message arg1) {
		if (mMessagePersistencer==null) {
			mMessagePersistencer =new MessagePersistencer(mContext);
		}
		mMessagePersistencer.save(arg1);
		sendNotice(arg1);
	}

	private void sendNotice(Message arg1) {
		NotificationUtil.sendSimpleNotification(mContext, arg1.getFrom(), arg1.getPacketID()+ arg1.getBody());
		
	}
}
